#include "config.h"
#include "Windows.h"
#include "aux_types.h"
#include "aux_errno.h"
#include "aux_process.h"
#include "win_process.h"

EErrNo xIPCWin32CreateBackgroundProcess(TxIPCProcess* ptProcess)
{
    //LPWSTR szCommandLine = TEXT("NOTEPAD");//错误
    //STARTUPINFO si = { sizeof(si) };
    STARTUPINFO si;
    PROCESS_INFORMATION pi;
    BOOL bRet = FALSE;

    if (!ptProcess ||
        (!(ptProcess->pszExePath) && !(ptProcess->pszParameters)))
        return ERRNO_FAIL;

    ZeroMemory(&si, sizeof(si));
    si.cb = sizeof(si);
    ZeroMemory(&pi, sizeof(pi));

    si.dwFlags = STARTF_USESHOWWINDOW;  // 指定wShowWindow成员有效
    si.wShowWindow = FALSE;        // 此成员设为TRUE的话则显示新建进程的主窗口，
                                        // 为FALSE的话则不显示
    bRet = CreateProcess (
        ptProcess->pszExePath,    // 不在此指定可执行文件的文件名
        ptProcess->pszParameters, // 命令行参数
        NULL,                     // 默认进程安全性
        NULL,                     // 默认线程安全性
        FALSE,                    // 指定当前进程内的句柄不可以被子进程继承
        CREATE_NEW_CONSOLE,       // 为新进程创建一个新的控制台窗口
        NULL,                     // 使用本进程的环境变量
        NULL,                     // 使用本进程的驱动器和目录
        &si,
        &pi);

    if(bRet)
    {
        //WaitForSingleObject(pi.hProcess, INFINITE);
        // 既然我们不使用两个句柄，最好是立刻将它们关闭
        CloseHandle (pi.hThread);
        CloseHandle (pi.hProcess);

        //printf(" 新进程的进程ID号：%d \n", pi.dwProcessId);
        //printf(" 新进程的主线程ID号：%d \n", pi.dwThreadId);
        ptProcess->nProcessId = pi.dwProcessId;
        return ERRNO_SUCCESS;
    }
    else
    {
        return ERRNO_FAIL;
    }

}


EErrNo xIPCWin32GetProcessInterface(TxIPCProcessInterface *pInterface)
{
    if (!pInterface)
        return ERRNO_FAIL;

    memset(pInterface, 0, sizeof(TxIPCProcessInterface));

    pInterface->CreateBackground = xIPCWin32CreateBackgroundProcess;

    return ERRNO_SUCCESS;
}


